import 'package:flutter/cupertino.dart';

abstract class DataChangeStateListener<W extends StatefulWidget, T> extends State<W> {

  final List<T> dataList = [];

  int getTotal() {
    return dataList.length;
  }

  T getData(int index) {
    if (index >=0 && index < dataList.length) {
      return dataList[index];
    }
    throw Exception("index 超出范围");
  }

  void setData(List<T> datas) {
    setState(() {
      dataList.clear();
      dataList.addAll(datas);
    });
  }

  void addData(T t) {
    setState(() {
      dataList.add(t);
    });
  }

  void addDatas(List<T> ts) {
    setState(() {
      dataList.addAll(ts);
    });
  }

  void setDataState(Function function) {
    setState((){
      function.call();
    });
  }

  void addFirst(T t) {
    setState(() {
      dataList.insert(0, t);
    });
  }

  void addFirsts(List<T> ts) {
    setState(() {
      dataList.insertAll(0, ts);
    });
  }

  void deleteData(T t) {
    setState(() {
      dataList.remove(t);
    });
  }

  void clearDatas() {
    setState(() {
      dataList.clear();
    });
  }

  void updateData(T t) {
    int index = dataList.indexOf(t);
    if (index < 0) return;
    setState(() {
      int size = dataList.length;
      dataList.replaceRange(index, index+1, [t]);
      int size1 = dataList.length;
      print("size: $size : $size1");
    });
  }

  int getDataByKey(T searchData, Function selectFunction) {
    var index = 0;
    for(var d in dataList) {
      if (selectFunction(d, searchData)) {
        return index;
      }
      index++;
    }
    return -1;
  }
}

abstract class DataChangeListener<T> extends ChangeNotifier {

  final List<T> dataList = [];

  void addData(T t) {
    dataList.add(t);
    notifyListeners();
  }

  void addDatas(List<T> ts) {
    dataList.addAll(ts);
    notifyListeners();
  }

  void addFirst(T t) {
    dataList.insert(0, t);
    notifyListeners();
  }

  void addFirsts(List<T> ts) {
    dataList.insertAll(0, ts);
    notifyListeners();
  }

  void deleteData(T t) {
    dataList.remove(t);
    notifyListeners();
  }

  void updateData(T t) {
    int index = dataList.indexOf(t);
    if (index < 0) return;
    dataList.replaceRange(index, index, [t]);
    notifyListeners();
  }
}